package main

import (
	"encoding/json"
	"errors"
	"fmt"
	"math"
	"net/http"
	"strconv"
	"strings"
)

const (
	// 360度分八个区间，每个区间前闭后开

	// 大于337.5 小于等于22.5
	North = "北侧"
	// 大于157.5 小于等于202.5
	South = "南侧"
	// 大于67.5  小于等于112.5
	East = "东侧"
	// 大于247.5  小于等于292.5
	West = "西侧"
	// 没有坐标区间
	Center = "中心"
	// 大于22.5   小于等于67.5
	Northeast = "东北"
	// 大于112.5  小于等于157.5
	Southeast = "东南"
	// 大于292.5  小于等于337.5
	Northwest = "西北"
	// 大于202.5  小于等于247.5
	SouthWest = "西南"
	//directionEnum := []string{"北侧", "东北", "东侧", "东南", "南侧", "西南", "西侧", "西北"}

)

func main() {

	aaa := 33.22
	bbb := 22.34
	sprintf := fmt.Sprintf("aaaaaa---%v----bbbbb---%v----", aaa, bbb)
	fmt.Println(sprintf)
	fmt.Println("hello")
	decimal := GpsToDecimal("")
	fmt.Println(decimal)
	longitude, latitude, _ := GpsToGaoDe()
	fmt.Println("longitude", longitude)
	fmt.Println("latitude", latitude)

	// GPS 参数获取   Y
	// GPS 数据转换为小数  Y
	// GPS 坐标转换为高德地图坐标
	// 获取小区坐标数据
	// 获取图片与小区的距离
	// 获取图片与小区的北偏角度
	// 北京西北  115.573453,40.201449
	// 北京     116.405668,39.911337
	angle, position, _ := GetAngle(166.31759643527778, 39.95930099472223, 116.44393142098, 39.868602341537)
	fmt.Println("angle", angle)
	fmt.Println("position", position)
	distance, _ := EarthDistance(115.762968, 40.130086, 117.1033, 40.237102)
	fmt.Println("distance", distance)

}

// 东八区  经度左边小右边大   维度北侧大，南侧小
func GetAngle(longitude, latitude, centerLongitude, centerLatitude float64) (float64, string, error) {
	directionEnum := []string{"中心", "北侧", "东北", "东侧", "东南", "南侧", "西南", "西侧", "西北"}
	// 判断是否极端情况
	if longitude == centerLongitude {
		if latitude == centerLatitude {
			return 0, directionEnum[0], nil
		} else if latitude < centerLatitude {
			return 180, directionEnum[5], nil
		} else {
			return 0, directionEnum[1], nil
		}
	}
	if latitude == centerLatitude {
		if longitude == centerLongitude {
			return 0, directionEnum[0], nil
		} else if longitude < centerLongitude {
			return 270, directionEnum[7], nil
		} else {
			return 90, directionEnum[3], nil
		}
	}
	// 先判断经度
	resAngle := 0.0
	absLatitude := math.Abs(latitude - centerLatitude)
	absLongitude := math.Abs(longitude - centerLongitude)
	// 获取弧度
	radian := math.Atan(absLatitude / absLongitude)
	// 获取角度
	angle := radian * 180 / math.Pi
	if longitude < centerLongitude {
		// 小————>在西侧
		resAngle = resAngle + 180
		if latitude > centerLatitude {
			// 大----在北侧   第二象限
			resAngle = resAngle + 90
			resAngle = resAngle + angle
		} else {
			// 小----在南侧   第三象限
			resAngle = resAngle + 90 - angle
		}
	} else {
		// 大————>在东侧
		if latitude > centerLatitude {
			// 大————>在北侧  第一象限
			resAngle = 90 - angle
		} else {
			// 小————>在南侧  第四象限
			resAngle = resAngle + 90
			resAngle = resAngle + angle
		}
	}
	directionIndex := (resAngle+22.5)/45 + 1
	return resAngle * 100, directionEnum[int64(directionIndex)], nil
}

// GPS数据转换为高德地图
func GpsToGaoDe() (float64, float64, error) {
	get, err := http.Get("https://restapi.amap.com/v3/assistant/coordinate/convert?locations=116.481499,39.990475&coordsys=gps&output=json&key=1c0407194d3ea19b15c002c3772757f2")
	if err != nil {
		fmt.Println("err", err)
		return 0, 0, nil
	}
	// 初始化请求变量结构
	formData := make(map[string]interface{})
	// 调用json包的解析，解析请求body
	_ = json.NewDecoder(get.Body).Decode(&formData)
	fmt.Println("formData", formData)
	info, infoOk := formData["info"]
	status, statusOk := formData["status"]
	if infoOk && statusOk && info == "ok" && status == "1" {
		fmt.Println("locations", formData["locations"])
		locations := formData["locations"]
		locationsStr := locations.(string)
		locationsSplit := strings.Split(locationsStr, ",")
		longitude, _ := strconv.ParseFloat(locationsSplit[0], 64)
		latitude, _ := strconv.ParseFloat(locationsSplit[1], 64)
		return longitude, latitude, nil
	}
	return 0, 0, nil
}

// 转换GPS坐标度分秒为小数形式：57°55’56.6″ =57+55/60+56.6/3600=57.9323888888888
func GpsToDecimal(coordinate string) float64 {
	coordinate = "57,55,56.6"
	split := strings.Split(coordinate, ",")
	if len(split) != 3 {
		fmt.Println("经纬度数据格式错误")
	}
	firstStr := split[0]
	secondStr := split[0]
	thirdStr := split[0]
	first, _ := strconv.ParseFloat(firstStr, 64)
	second, _ := strconv.ParseFloat(secondStr, 64)
	third, _ := strconv.ParseFloat(thirdStr, 64)
	return first + second/60 + third/3600
}

// 计算坐标距离 单位：千米
func EarthDistance(longitude, latitude, centerLongitude, centerLatitude float64) (float64, error) {
	if longitude == 0 || latitude == 0 || centerLongitude == 0 || centerLatitude == 0 {
		return 0, errors.New("数据异常")
	}
	radius := 6378.137
	rad := math.Pi / 180.0
	longitude = longitude * rad
	latitude = latitude * rad
	centerLongitude = centerLongitude * rad
	centerLatitude = centerLatitude * rad
	theta := centerLongitude - longitude
	dist := math.Acos(math.Sin(latitude)*math.Sin(centerLatitude) + math.Cos(latitude)*math.Cos(centerLatitude)*math.Cos(theta))
	return dist * radius, nil
}

//func EarthDistance(lat1, lng1, lat2, lng2 float64) float64 {
//	radius := 6378.137
//	rad := math.Pi / 180.0
//	lat1 = lat1 * rad
//	lng1 = lng1 * rad
//	lat2 = lat2 * rad
//	lng2 = lng2 * rad
//	theta := lng2 - lng1
//	dist := math.Acos(math.Sin(lat1)*math.Sin(lat2) + math.Cos(lat1)*math.Cos(lat2)*math.Cos(theta))
//	return dist * radius
//}

// 高德地图转百度坐标
func GaoDeToBaidu(gdLon float64, gdLat float64) (float64, float64) {
	PI := 3.14159265358979324 * 3000.0 / 180.0
	x := gdLon
	y := gdLat
	z := math.Sqrt(x*x+y*y) + 0.00002*math.Sin(y*PI)
	theta := math.Atan2(y, x) + 0.000003*math.Cos(x*PI)
	return z*math.Cos(theta) + 0.0065, z*math.Sin(theta) + 0.006
}

// 百度地图转高德地图
func BdToGaoDe(bdLat float64, bdLon float64) (float64, float64) {
	PI := 3.14159265358979324 * 3000.0 / 180.0
	x := bdLon - 0.0065
	y := bdLat - 0.006
	z := math.Sqrt(x*x+y*y) - 0.00002*math.Sin(y*PI)
	theta := math.Atan2(y, x) - 0.000003*math.Cos(x*PI)
	return z * math.Cos(theta), math.Sin(theta)
}

// 常州融创御园三期   高德经度  119.935018  高的纬度  31.728539

//https://restapi.amap.com/v3/staticmap?scale=2&location=104.048893,30.615409&size=480*210&zoom=13&key=1c0407194d3ea19b15c002c3772757f2

//"github.com/rwcarlsen/goexif/exif"
